/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.modelos.validadores;

import br.com.saber.certificacao.ejbs.stateless.interfaces.QuestaoBeanLocal;
import br.com.saber.certificacao.modelos.Certificacao;
import br.com.saber.certificacao.modelos.Questao;
import br.com.saber.certificacao.modelos.Resposta;
import br.com.saber.certificacao.modelos.Versao;
import br.com.saber.certificacao.modelos.validadores.exceptions.QuestaoException;
import br.com.saber.certificacao.modelos.validadores.exceptions.generica.ValidacaoExcecao;
import br.com.saber.certificacao.modelos.validadores.interfaces.ValidadorInterface;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author gbvbahia
 */
public class QuestaoValidador implements ValidadorInterface<Questao, QuestaoBeanLocal> {

    private void validar(Questao entidade, QuestaoBeanLocal bean) throws ValidacaoExcecao {
        if(entidade == null){
            lancarException(("questaoNula"), "Questão");
        }
        if (entidade.getContestacoes() == null) {
            lancarException(("questaoContestacoesNula"), "Contestações");
        }
        if (StringUtils.isBlank(entidade.getEnunciado())) {
            lancarException(("questaoEnunciadoNulo"), "Enunciado");
        }
        if (entidade.getEnunciado().length() > 2000) {
            lancarException(("questaoEnunciadoLongo"), "Enunciado");
        }
        if (entidade.getLinguagem() == null) {
            lancarException(("questaoLinguagemNula"), "Idioma");
        }
        if (StringUtils.isBlank(entidade.getObjetivoCertificacao())) {
            lancarException(("questaoObjetivoCertificacaoNulo"), "Objetivo Certificação");
        }
        if (entidade.getObjetivoCertificacao().length() > 150) {
            lancarException(("questaoObjetivoCertificacaoLongo"), "Objetivo Certificação");
        }
        if (StringUtils.isBlank(entidade.getObservacao())) {
            lancarException(("questaoObservacaoNula"), "Observação");
        }
        if (entidade.getObservacao().length() > 255) {
            lancarException(("questaoObservacaoLongo"), "Observação");
        }
        if (entidade.getTipoQuestao() == null) {
            lancarException(("questaoTipoQuestaoNulo"), "Tipo da Questão");
        }
        if (entidade.getRespostas().size() < 4) {
            lancarException(("questoesMinRespostasErro"), "Respostas");
        }
        if (entidade.getRespostas().size() > 8) {
            lancarException(("questoesMaxRespostasErro"), "Respostas");
        }
        if (!isRespostaVerdadeira(entidade.getRespostas())) {
            lancarException(("questaoSemRespostaVerdadeira"), "Respostas");
        }
        validaRespostas(entidade, bean);
        if (entidade.getProfessorResponsavel() == null) {
            lancarException(("questoesProfessosRespNulo"), "Professor Responsável");
        }
    }

    private boolean isCertificacoesValidas(List<Versao> versoes){
        Set<Certificacao> set = new LinkedHashSet<Certificacao>();
        for(Versao v : versoes){
            set.add(v.getCertificacao());
        }
        return set.size() == 1 ? true : false;
    }
    
    private boolean isRespostaVerdadeira(Set<Resposta> respostas) {
        for (Resposta resposta : respostas) {
            if (resposta.isCorreta()) {
                return true;
            }
        }
        return false;
    }

    private void validaRespostas(Questao questao, QuestaoBeanLocal bean) {
        RespostaValidador rv = new RespostaValidador();
        for (Resposta res : questao.getRespostas()) {
            rv.validar(res, bean, null);
        }
    }

    private void lancarException(String msg, String atributo) {
        QuestaoException ex = new QuestaoException(msg);
        ex.setAtributoName(atributo);
        throw ex;
    }

    @Override
    public void validar(Questao entidade, QuestaoBeanLocal bean, Object object) throws ValidacaoExcecao {
        this.validar(entidade, bean);
         List<Versao> versoes = (List<Versao>) object;
        if (entidade.getId() != null && (versoes == null || versoes.isEmpty())) {
            lancarException(("questoesVersaoNaoDefinida"), "Versão");
        }
        if(!isCertificacoesValidas(versoes)){
            lancarException(("questoesVersaoCertificacaoMultiplas"), "Versão");
        }
    }
}
